package com.zj;

import com.zj.api.HostInfo;
import com.zj.util.HostInfoCollector;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @program: monitor147
 * @description:
 * @author: zy
 * @create: 2025-06-04 18:56
 */
public class MonitorClientHandler  extends SimpleChannelInboundHandler<Object> {
    private static final Logger logger= LoggerFactory.getLogger(MonitorClientHandler.class);

    @Override
    protected void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception {
        System.out.println("收到服务端消息："+msg);  //读的数据，从服务端来的
    }

    //通道激活时调用  向服务端写数据
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        //只要通道一建立，就定时向服务器发送本机 状态信息
        Channel ch=ctx.channel();
        ch.eventLoop().scheduleAtFixedRate(  //取到线程池中的线程.scheduleAtFixedRate定时调度任务
                ()->{
                    HostInfo hi= null;
                    try {
                        hi = HostInfoCollector.getHostInfo();//使用common模块中的方法获取本机信息,得到一个对象hi
                    } catch (InterruptedException e) {
                        logger.error("oshi获取本机信息失败,原因:{}", e.getMessage());
                    }
                    ch.writeAndFlush(hi);  //向服务端写数据 延时5s
                    logger.info("调度一次发送任务，数据:{}", hi);
                } , 5, 5, java.util.concurrent.TimeUnit.SECONDS
        );
        //scheduleAtFixedRate(参数一：runnable对象,需要执行的任务;
        //                    参数二：延时的时间，几秒之后会执行；
        //                    参数三：间隔时间，多久执行一次；
        //                    参数四：时间单位)
        super.channelActive(ctx);//调用父类的方法，让程序往下继续执行
    }
}